#pragma once
#include <vector>
#include <iostream>
#include <cstddef>
#include <algorithm>
#include <cassert>

namespace CH
{
	#define BUFFER_SIZE (1024 * 1024 * 10)
	class Buffer
	{
	public:
		Buffer()
			: _buffer(BUFFER_SIZE), _read_idx(0), _write_idx(0)
		{
		}
		// 向缓冲区写入数据
		void push(const char *data, size_t len)
		{
			// 如果剩余空间不够则阻塞
			if (len > writeAbleSize())
				return;
			// 将数据拷贝到缓冲区中
			std::copy(data, data + len, &_buffer[_write_idx]);
			// 移动缓冲区中写的位置
			moveWriter(len);
		}
		// 返回可写空间的长度
		size_t writeAbleSize()
		{
			return _buffer.size()-_write_idx;
		}
		// 返回可读空间的长度
		size_t readAbleSize()
		{
			return _write_idx-_read_idx;
		}
		// 返回可读数据的长度的首地址
		const char *begin()
		{
			return &_buffer[_read_idx];
		}
		// 对于读指针向后偏移
		void moveReader(size_t len)
		{
			assert(len <= readAbleSize());
			_read_idx += len;
		}
		// 重制读写位置，初始化缓冲区
		void bufferReset()
		{
			_read_idx = 0;
			_write_idx = 0;
		}
		// 对_buffer实现交换的操作
		void bufferSwap(Buffer &buffer)
		{
			std::swap(_buffer,buffer._buffer);
			std::swap(_read_idx,buffer._read_idx);
			std::swap(_write_idx,buffer._write_idx);
		}
		// 判断缓冲区是否为空
		bool bufferEmpty()
		{
			return _read_idx==_write_idx;
		}

	private:
		// 对于写指针向后偏移
		void moveWriter(size_t len)
		{
			assert(len <= writeAbleSize());
			_write_idx += len;
		}

	private:
		std::vector<char> _buffer; // 缓冲区
		size_t _read_idx;		   // 当前可读数据的下标
		size_t _write_idx;		   // 当前可写数据的下标
	};
}